home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CUCD / Programming / OUI / include / rcs / slist.h < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  5.3 KB  |  201 lines

  1. head    1.2;
  2. access;
  3. symbols;
  4. locks
  5.     dlorre:1.2; strict;
  6. comment    @ * @;
  7.  
  8.  
  9. 1.2
  10. date    97.07.14.04.25.18;    author dlorre;    state Exp;
  11. branches;
  12. next    1.1;
  13.  
  14. 1.1
  15. date    96.08.22.02.05.49;    author dlorre;    state Exp;
  16. branches;
  17. next    ;
  18.  
  19.  
  20. desc
  21. @Oui.lib -- Object User Interface
  22. Projet créé en 1994
  23. Auteur: Dominique Lorre
  24. @
  25.  
  26.  
  27. 1.2
  28. log
  29. @index() renamed as indexof()
  30. @
  31. text
  32. @// Projet : Euterpe
  33. // Fichier : liste.h
  34.  
  35. // Auteur : Dominique Lorre
  36. // Date de création : 15/07/94
  37.  
  38. #ifndef CLASS_SLIST_H
  39. #define CLASS_SLIST_H
  40.  
  41. #include <exec/types.h>
  42.  
  43.  
  44. // =========================================================================
  45. // ========================== SLINK CLASS ==================================
  46. // =========================================================================
  47.  
  48.  
  49. class slink {
  50. friend class slist ;
  51. friend class slink_iter ;
  52.     slink *pred ;           // preceding node
  53.     slink *succ ;           // next node
  54. protected:
  55.     virtual  long type() const ;
  56. public:
  57.     long    indexof() ;                           // position in list
  58.  
  59.     slink() : pred(NULL), succ(NULL) {}
  60.     virtual ~slink() ;
  61.     virtual slink*  _follower() const
  62.     {slink *p = next() ;
  63.         while (p && p->type() != type()) p = p->next() ;
  64.         return p ;
  65.     }
  66.     virtual slink*  _predecessor() const
  67.     {slink *p = prev() ;
  68.         while (p && p->type() != type()) p = p->prev() ;
  69.         return p ;
  70.     }
  71.     slink*  next() const { return succ ; }     // move functions
  72.     slink*  prev() const { return pred ; }
  73.     slink*  follower() const
  74.     { return _follower() ; }
  75.     slink*  predecessor() const { return _predecessor() ; }
  76. };
  77.  
  78.  
  79. // =========================================================================
  80. // ========================== SLIST CLASS ==================================
  81. // =========================================================================
  82.  
  83.  
  84. class slist
  85. {
  86. friend class slink_iter ;
  87.     slink*  head ;
  88.     slink*  tail ;
  89. public:
  90.     slist() : head(NULL), tail(NULL) {}
  91.     virtual ~slist() ;
  92.     void    init() { head = tail = NULL ;}
  93.     void    free() ;
  94.     void    addhead(slink *) ;
  95.     void    addtail(slink *) ;
  96.     void    insert(slink *, slink *) ;
  97.     void    remove(slink *c) ;
  98.     BOOL    isempty() { return head ? FALSE : TRUE ; }
  99.     slink*  get(long) ;
  100.     slink*  first() { return head ; }
  101.     slink*  last() { return tail ; }
  102.     void    replace(slink *, slink *) ;
  103.     long    count() ;
  104. };
  105.  
  106. // =========================================================================
  107. // ======================== SLINK_ITER CLASS ===============================
  108. // =========================================================================
  109.  
  110.  
  111. class slink_iter {
  112.     slink*   current ;
  113.     slist*   cs ;
  114. public:
  115.     slink_iter(slist *s) : cs(s) { current = cs->head ; }
  116.     void set_current(slink* n) { current = n ; }
  117.     slink* get_current() { return current ; }
  118.  
  119.     slink* first() { return current = cs->head ; }
  120.     slink* last()  { return current = cs->tail ; }
  121.  
  122.     slink* operator++()     // préfixe
  123.     {
  124.         return current ? current = current->succ  : NULL ;
  125.     } // préfixe
  126.     slink* operator++(int)  // postfixe
  127.     {
  128.     slink *t = current ;
  129.         current = current? current->succ: NULL ;
  130.         return t ;
  131.     }
  132.     slink* operator--()     // préfixe
  133.     {
  134.     return current ? current = current->pred : NULL ;
  135.     }
  136.     slink* operator--(int)  // postfixe
  137.     {
  138.     slink *t = current ;
  139.         current = current ? current->pred : NULL ;
  140.         return t ;
  141.     }
  142. };
  143.  
  144. // =========================================================================
  145. // ========================== NLINK CLASS ==================================
  146. // =========================================================================
  147.  
  148.  
  149. class nlink : public slink {    // slink with name
  150. public:
  151.     STRPTR label ;
  152.     nlink() : label(NULL) {}
  153.     nlink*   next() { return (nlink *)slink::next() ; }
  154.     nlink*   prev() { return (nlink *)slink::prev() ; }
  155. };
  156.  
  157. // =========================================================================
  158. // ========================== NLIST CLASS ==================================
  159. // =========================================================================
  160.  
  161.  
  162. class nlist : public slist
  163. {
  164. public:
  165.     nlink*  findname(STRPTR name) ;
  166.     void    enqueue(nlink *node) ;
  167.     nlink* first() { return (nlink *)slist::first() ; }
  168.     nlink* last() { return (nlink *)slist::last() ; }
  169. };
  170.  
  171. // =========================================================================
  172. // ===================== NLINK_ITER CLASS ==================================
  173. // =========================================================================
  174.  
  175.  
  176. class nlink_iter : private slink_iter {
  177. public:
  178.     nlink_iter(slist *s) : slink_iter(s) {}
  179.     void set_current(nlink* n) { slink_iter::set_current((slink *)n) ; }
  180.     nlink* get_current() { return (nlink *)slink_iter::get_current() ; }
  181.     nlink* first() { return (nlink *) slink_iter::first() ; }
  182.     nlink* last() { return (nlink *) slink_iter::last() ; }
  183.     nlink* operator++() { return (nlink *) slink_iter::operator++(); }
  184.     nlink* operator++(int) { return (nlink *) slink_iter::operator++(0); }
  185.     nlink* operator--() { return (nlink *) slink_iter::operator--(); }
  186.     nlink* operator--(int) { return (nlink *) slink_iter::operator--(0); }
  187. };
  188.  
  189. #endif@
  190.  
  191.  
  192. 1.1
  193. log
  194. @Initial revision
  195. @
  196. text
  197. @d26 1
  198. a26 1
  199.     long    index() ;                           // position in list
  200. @
  201.